/************************************************************************
 * Copyright 2008, Strathclyde Planning Group,
 * Department of Computer and Information Sciences,
 * University of Strathclyde, Glasgow, UK
 * http://planning.cis.strath.ac.uk/
 *
 * Maria Fox, Richard Howey and Derek Long - VAL
 * Stephen Cresswell - PDDL Parser
 *
 * This file is part of VAL, the PDDL validator.
 *
 * VAL is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * VAL is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with VAL.  If not, see <http://www.gnu.org/licenses/>.
 *
 ************************************************************************/

#ifndef __WRITECONTROLLER
#define __WRITECONTROLLER

#include "ptree.h"

namespace VAL {

  class WriteController {
   public:
    virtual ~WriteController(){};

    virtual void write_symbol(ostream &o, const symbol *){};
    virtual void write_control_symbol(ostream &o, const control_symbol *){};
    virtual void write_pred_symbol(ostream &o, const pred_symbol *){};
    virtual void write_func_symbol(ostream &o, const func_symbol *){};
    virtual void write_class_symbol(ostream &o, const class_symbol *){};
    virtual void write_const_symbol(ostream &o, const const_symbol *){};
    virtual void write_var_symbol(ostream &o, const var_symbol *){};
    virtual void write_pddl_typed_symbol(ostream &o,
                                         const pddl_typed_symbol *){};
    virtual void write_plus_expression(ostream &o, const plus_expression *){};
    virtual void write_minus_expression(ostream &o, const minus_expression *){};
    virtual void write_mul_expression(ostream &o, const mul_expression *){};
    virtual void write_div_expression(ostream &o, const div_expression *){};
    virtual void write_uminus_expression(ostream &o,
                                         const uminus_expression *){};
    virtual void write_int_expression(ostream &o, const int_expression *){};
    virtual void write_float_expression(ostream &o, const float_expression *){};
    virtual void write_special_val_expr(ostream &o, const special_val_expr *){};
    virtual void write_violation_term(ostream &o, const violation_term *){};
    virtual void write_func_term(ostream &o, const func_term *){};
    virtual void write_class_func_term(ostream &o, const class_func_term *){};
    virtual void write_assignment(ostream &o, const assignment *){};
    virtual void write_goal_list(ostream &o, const goal_list *p) {
      p->pc_list< goal * >::write(o);
    };
    virtual void write_preference(ostream &o, const preference *p){};
    virtual void write_constraint_goal(ostream &o, const constraint_goal *){};
    virtual void write_simple_goal(ostream &o, const simple_goal *){};
    virtual void write_qfied_goal(ostream &o, const qfied_goal *){};
    virtual void write_conj_goal(ostream &o, const conj_goal *){};
    virtual void write_disj_goal(ostream &o, const disj_goal *){};
    virtual void write_timed_goal(ostream &o, const timed_goal *){};
    virtual void write_imply_goal(ostream &o, const imply_goal *){};
    virtual void write_neg_goal(ostream &o, const neg_goal *){};
    virtual void write_comparison(ostream &o, const comparison *){};
    virtual void write_proposition(ostream &o, const proposition *){};
    virtual void write_pred_decl_list(ostream &o, const pred_decl_list *p) {
      p->pc_list< pred_decl * >::write(o);
    };
    virtual void write_func_decl_list(ostream &o, const func_decl_list *p) {
      p->pc_list< func_decl * >::write(o);
    };
    virtual void write_classes_list(ostream &o, const classes_list *p) {
      p->pc_list< class_def * >::write(o);
    };
    virtual void write_pred_decl(ostream &o, const pred_decl *){};
    virtual void write_func_decl(ostream &o, const func_decl *){};
    virtual void write_simple_effect(ostream &o, const simple_effect *){};
    virtual void write_forall_effect(ostream &o, const forall_effect *){};
    virtual void write_cond_effect(ostream &o, const cond_effect *){};
    virtual void write_timed_effect(ostream &o, const timed_effect *){};
    virtual void write_supplied_effect(ostream &o, const supplied_effect *){};
    virtual void write_timed_initial_literal(ostream &o,
                                             const timed_initial_literal *){};
    virtual void write_effect_lists(ostream &o, const effect_lists *){};
    virtual void write_operator_list(ostream &o, const operator_list *p) {
      p->pc_list< operator_ * >::write(o);
    };
    virtual void write_derivations_list(ostream &o, const derivations_list *d) {
      d->pc_list< derivation_rule * >::write(o);
    };
    virtual void write_derivation_rule(ostream &o, const derivation_rule *d){};
    virtual void write_operator_(ostream &o, const operator_ *){};
    virtual void write_action(ostream &o, const action *){};
    virtual void write_event(ostream &o, const event *){};
    virtual void write_process(ostream &o, const process *){};
    virtual void write_durative_action(ostream &o, const durative_action *){};
    virtual void write_class_def(ostream &o, const class_def *){};
    virtual void write_domain(ostream &o, const domain *){};
    virtual void write_metric_spec(ostream &o, const metric_spec *){};
    virtual void write_length_spec(ostream &o, const length_spec *){};
    virtual void write_problem(ostream &o, const problem *){};
    virtual void write_plan_step(ostream &o, const plan_step *){};
  };

};  // namespace VAL

#endif
